package com.gzsxy.sso.core.utils;


import com.gzsxy.sso.common.dto.response.MenuRsp;
import com.gzsxy.sso.common.dto.response.TreeNode;
import org.springframework.util.ObjectUtils;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author xiaolong
 * @version 1.0
 * @description: TODO
 * @date 2021/11/18 15:54
 */
public class TreeUtil {

    /**
     * @description: 构建树
     * @param list 实体列表
     * @param <ID> ID类型
     * @param <T> 实体类型
     * @return  树结构列表
     */
    public static <ID,T extends TreeNode<ID, T>> List<T> build(List<T> list, Comparator<T> comparator){
        Map<ID, T> map = list.stream().collect(Collectors.toMap(T::getId, object -> object));
        return build(map,comparator);
    }

    /**
     * @description: 构建树
     * @param map ID-实体 Map
     * @param <ID> ID类型
     * @param <T> 实体类型
     * @return  树结构列表
     */
    public static <ID,T extends TreeNode<ID, T>> List<T> build(Map<ID,T> map,Comparator<T> comparator){
        List<T> nodeList = new ArrayList<>(map.values());
        if (comparator != null){
            nodeList.sort(comparator);
        }
        List<T> results = new ArrayList<>();
        for (T node : nodeList) {
            //如果上级Id为空说明当前为一级目录
            if (ObjectUtils.isEmpty(node.getParentId())){
                results.add(node);
            } else {
                //获取上级Id的实体
                T parent = map.get(node.getParentId());
                //不为null
                if (parent != null){
                    //添加到一级目录下的子目录Children里面
                    parent.getChildren().add(node);
                } else {
                    //如果上级id不为null，但实体类为null，充当一级目录
                    node.setParentId(null);
                    results.add(node);
                }
            }
        }
        return results;
    }



}
